A singly linked list with reverse…
In (not particularly beautiful) C++, both recursive and non-recursive reverse methods:
#include <iostream> using namespace std; class ListItem { public: ListItem() : next(NULL) {} char data[100]; ListItem *next; void reverse(ListItem *p) { if(next == NULL) { next = p; } else { next->reverse(this); next = p; } } }; class LinkedList { public: LinkedList() {} ListItem *start; ListItem *end; ListItem *push_back(char *data) { ListItem *i = new ListItem(); if(end != NULL) { end->next = i; } else { start = i; } for(size_t n=0;n<100;n++) {i->data[n] = data[n];} end = i; return i; } void reverse() { start->reverse(NULL); ListItem *temp = end; end = start; start = temp; } void reverse_nonrec() { ListItem *last=NULL; for(ListItem *p=start;p!=NULL;) { ListItem *next = p->next; p->next = last; last = p; p = next; } ListItem *temp = end; end = start; start = temp; } void dump() { for(ListItem *p=start;p!=NULL;p=p->next) { cout << "data: " << p->data << endl; } } ~LinkedList() { ListItem *op = NULL; for(ListItem *p=start;p!=NULL;p=p->next) { if(op != NULL) delete op; op = p; } if(op != NULL) delete op; } }; int main() { LinkedList mylist; char tempdata[100]; for(size_t n=0;n<100;n++) { tempdata[n] = 'A'; } tempdata[99] = 0; for(size_t n=0;n<20;n++) { mylist.push_back(tempdata); for(size_t n=0;n<99;n++) { tempdata[n]++; } } mylist.dump(); mylist.reverse(); cout << "Reversed List" << endl; mylist.dump(); cout << "Reverse again" << endl; mylist.reverse_nonrec(); mylist.dump(); }